// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build windows

package wingui

import (
    "syscall"
    "unsafe"
)

type Wndclassex struct {
    Size       uint32
    Style      uint32
    WndProc    uintptr
    ClsExtra   int32
    WndExtra   int32
    Instance   syscall.Handle
    Icon       syscall.Handle
    Cursor     syscall.Handle
    Background syscall.Handle
    MenuName   *uint16
    ClassName  *uint16
    IconSm     syscall.Handle
}

type Point struct {
    X uintptr
    Y uintptr
}

type Msg struct {
    Hwnd    syscall.Handle
    Message uint32
    Wparam  uintptr
    Lparam  uintptr
    Time    uint32
    Pt      Point
}

const (
    // Window styles
    WS_OVERLAPPED   = 0
    WS_POPUP        = 0x80000000
    WS_CHILD        = 0x40000000
    WS_MINIMIZE     = 0x20000000
    WS_VISIBLE      = 0x10000000
    WS_DISABLED     = 0x8000000
    WS_CLIPSIBLINGS = 0x4000000
    WS_CLIPCHILDREN = 0x2000000
    WS_MAXIMIZE     = 0x1000000
    WS_CAPTION      = WS_BORDER | WS_DLGFRAME
    WS_BORDER       = 0x800000
    WS_DLGFRAME     = 0x400000
    WS_VSCROLL      = 0x200000
    WS_HSCROLL      = 0x100000
    WS_SYSMENU      = 0x80000
    WS_THICKFRAME   = 0x40000
    WS_GROUP        = 0x20000
    WS_TABSTOP      = 0x10000
    WS_MINIMIZEBOX  = 0x20000
    WS_MAXIMIZEBOX  = 0x10000
    WS_TILED        = WS_OVERLAPPED
    WS_ICONIC       = WS_MINIMIZE
    WS_SIZEBOX      = WS_THICKFRAME
    // Common Window Styles
    WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
    WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW
    WS_POPUPWINDOW      = WS_POPUP | WS_BORDER | WS_SYSMENU
    WS_CHILDWINDOW      = WS_CHILD

    WS_EX_CLIENTEDGE = 0x200

    // Some windows messages
    WM_CREATE  = 1
    WM_DESTROY = 2
    WM_SIZE    = 5
    WM_CLOSE   = 16
    WM_COMMAND = 273

    // Some button control styles
    BS_DEFPUSHBUTTON = 1

    // Some color constants
    COLOR_WINDOW  = 5
    COLOR_BTNFACE = 15

    // Default window position
    CW_USEDEFAULT = 0x80000000 - 0x100000000

    // Show window default style
    SW_SHOWDEFAULT = 10
)

var (
    // Some globally known cursors
    IDC_ARROW = MakeIntResource(32512)
    IDC_IBEAM = MakeIntResource(32513)
    IDC_WAIT  = MakeIntResource(32514)
    IDC_CROSS = MakeIntResource(32515)

    // Some globally known icons
    IDI_APPLICATION = MakeIntResource(32512)
    IDI_HAND        = MakeIntResource(32513)
    IDI_QUESTION    = MakeIntResource(32514)
    IDI_EXCLAMATION = MakeIntResource(32515)
    IDI_ASTERISK    = MakeIntResource(32516)
    IDI_WINLOGO     = MakeIntResource(32517)
    IDI_WARNING     = IDI_EXCLAMATION
    IDI_ERROR       = IDI_HAND
    IDI_INFORMATION = IDI_ASTERISK
)

//sys   GetModuleHandle(modname *uint16) (handle syscall.Handle, err error) = GetModuleHandleW
//sys   RegisterClassEx(wndclass *Wndclassex) (atom uint16, err error) = user32.RegisterClassExW
//sys   CreateWindowEx(exstyle uint32, classname *uint16, windowname *uint16, style uint32, x int32, y int32, width int32, height int32, wndparent syscall.Handle, menu syscall.Handle, instance syscall.Handle, param uintptr) (hwnd syscall.Handle, err error) = user32.CreateWindowExW
//sys   DefWindowProc(hwnd syscall.Handle, msg uint32, wparam uintptr, lparam uintptr) (lresult uintptr) = user32.DefWindowProcW
//sys   DestroyWindow(hwnd syscall.Handle) (err error) = user32.DestroyWindow
//sys   PostQuitMessage(exitcode int32) = user32.PostQuitMessage
//sys   ShowWindow(hwnd syscall.Handle, cmdshow int32) (wasvisible bool) = user32.ShowWindow
//sys   UpdateWindow(hwnd syscall.Handle) (err error) = user32.UpdateWindow
//sys   GetMessage(msg *Msg, hwnd syscall.Handle, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) [failretval==-1] = user32.GetMessageW
//sys   TranslateMessage(msg *Msg) (done bool) = user32.TranslateMessage
//sys   DispatchMessage(msg *Msg) (ret int32) = user32.DispatchMessageW
//sys   LoadIcon(instance syscall.Handle, iconname *uint16) (icon syscall.Handle, err error) = user32.LoadIconW
//sys   LoadCursor(instance syscall.Handle, cursorname *uint16) (cursor syscall.Handle, err error) = user32.LoadCursorW
//sys   SetCursor(cursor syscall.Handle) (precursor syscall.Handle, err error) = user32.SetCursor
//sys   SendMessage(hwnd syscall.Handle, msg uint32, wparam uintptr, lparam uintptr) (lresult uintptr) = user32.SendMessageW
//sys   PostMessage(hwnd syscall.Handle, msg uint32, wparam uintptr, lparam uintptr) (err error) = user32.PostMessageW

func MakeIntResource(id uint16) *uint16 {
    return (*uint16)(unsafe.Pointer(uintptr(id)))
}
